package pres.hdy.htmltopdf.factory;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;

import com.itextpdf.text.pdf.BaseFont;

import freemarker.cache.FileTemplateLoader;
import pres.hdy.htmltopdf.arch.SimplePdf;
import pres.hdy.htmltopdf.arch.TemplatePdf;
import pres.hdy.htmltopdf.config.TemplateConfig;
import pres.hdy.htmltopdf.inter.SimpleConfig;
import pres.hdy.htmltopdf.inter.SimpleInter;
import pres.hdy.htmltopdf.inter.TemplateInter;

public class PdfFactory {
	private SimpleConfig pdfConfig;
	private String encoding = "utf-8";

	public PdfFactory() {
		pdfConfig = new TemplateConfig();
		setEncoding(this.encoding);
	}

	public PdfFactory(SimpleConfig pdfConfig) {
		this.pdfConfig = pdfConfig;
	}

	public void setPdfConfig(SimpleConfig pdfConfig) {
		this.pdfConfig = pdfConfig;
	}

	/**
	 * 
	 * @param encoding
	 *            设置template编码
	 */
	public void setEncoding(String encoding) {
		this.encoding = encoding;
		this.pdfConfig.setEncoding(encoding);
	}

	/**
	 * 
	 * @param basePath
	 *            设置template的基本路径
	 */
	public void setBasePath(String basePath) {
		try {
			this.pdfConfig.setTemplateLoader(new FileTemplateLoader(new File(basePath)));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 
	 * @return 简单html转pdf接口
	 */
	public SimpleInter getSimpleInter() {
		return new SimplePdf(this.pdfConfig);
	}

	/**
	 * @param font
	 *            font为字体绝对路径或字体所属文件夹
	 * @return 简单html转pdf接口
	 */
	public SimpleInter getSimpleInter(String font) {
		addFontDir(font);
		return new SimplePdf(this.pdfConfig);
	}

	/**
	 * 
	 * @return 简单template转pdf接口
	 */
	public TemplateInter getTemplateInter() {
		return new TemplatePdf(this.pdfConfig);
	}

	/**
	 * 
	 * @param font
	 *            font为字体绝对路径或字体所属文件夹
	 * @return 简单template转pdf接口
	 */
	public TemplateInter getTemplateInter(String font) {
		addFontDir(font);
		return new TemplatePdf(this.pdfConfig);
	}

	public void addFont(String path) {
		this.pdfConfig.addFont(path, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
	}

	public void addFontDir(String dir) {
		File file = new File(dir);
		if (file.isDirectory()) {
			File[] files = file.listFiles(new FilenameFilter() {
				public boolean accept(File dir, String name) {
					String lower = name.toLowerCase();
					return ((lower.endsWith(".otf")) || (lower.endsWith(".ttf")) || (lower.endsWith(".ttc")));
				}
			});
			for (File f : files) {
				addFont(f.getAbsolutePath());
			}
		} else {
			addFont(dir);
		}
	}
}
